package com.speaktoitcookbook.dao;

import java.sql.SQLException;
import java.util.List;

import com.speaktoitcookbook.bean.User;
import com.speaktoitcookbook.bean.UserInfo;

/**
 * 定义用户帐号数据库操作相关接口
 * 
 * @author 杨强
 * 
 */
public interface IUserDao {

    /**
     * 向数据库插入一个用户，包括账号和详细信息
     * 
     * @param user
     *            用户帐号，不能null
     * @param userInfo
     *            用户信息，若为null，则创建默认信息
     * @return true成功，false失败
     * @throws SQLException
     *             数据库异常
     */
    public boolean doCreate(User user, UserInfo userInfo) throws SQLException;

    /**
     * 更新数据库一个用户账号，只更新密码信息
     * 
     * @param user
     *            用户帐号，不能为空
     * @return true成功，false失败
     * @throws SQLException
     *             数据库异常
     */
    public boolean doUpdate(User user) throws SQLException;

    /**
     * 删除数据库一个用户账号，此方法会删除数据库中所有跟账号相关联的信息
     * 
     * @param user
     *            用户帐号，不能为空
     * @return true成功，false失败
     * @throws SQLException
     *             数据库异常
     */
    public boolean doDelete(User user) throws SQLException;

    /**
     * 删除数据库一个用户账号，此方法会删除数据库中所有跟账号相关联的信息
     * 
     * @param userID
     *            用户帐号标识，不能为空
     * @return true成功，false失败
     * @throws SQLException
     *             数据库异常
     */
    public boolean doDelete(String userID) throws SQLException;

    /**
     * 查找数据库一个用户账号，此方法主要用于用户登录使用
     * 
     * @param user
     *            用户帐号，不能为空
     * @return 用户帐号，若未找到则为null
     * @throws SQLException
     *             数据库异常
     */
    public User getUser(User user) throws SQLException;

    /**
     * 查找数据库一个用户账号，此方法根据账号标识查找账号
     * 
     * @param userID
     *            用户帐号标识，不能为空
     * @return 用户帐号，若未找到则为null
     * @throws SQLException
     *             数据库异常
     */
    public User getUser(String userID) throws SQLException;

    /**
     * 根据指定条件查找数据库用户账号，建议指定相关条件查询<br>
     * <b>注意：如果查找结果过多，可能会发生溢出</b>
     * 
     * @param params
     *            查询条件，可为空
     *            <p>
     *            示例：
     *            <ol>
     *            <li>"where `userID` like '%123%'"<br>
     *            将查询账号中包含123的账号</li>
     *            <li>new String[]{"where `userID` like '%123%' ",
     *            "and `userPWD` = '123'"}<br>
     *            将查询账号中包含123并且密码为123的账号</li>
     *            </ol>
     *            </p>
     * @return 用户帐号集合，若未找到则为null
     * @throws SQLException
     *             数据库异常
     */
    public List<User> getUser(Object... params) throws SQLException;
}
